/*
 * PruebaMySQL.java
 *
 * Programa de prueba para conexión a una base de datos de MySQL.
 * Presupone que el servidor de base de datos está arrancado, disponible,
 * en el puerto por defecto.
 * El usuario y password de conexión con la base de datos debe cambiarse.
 * En la base de datos se supone que hay una base de datos llamada prueba y que
 * tiene una tabla persona con tres campos, de esta manera:
 * mysql> create database prueba;
 * mysql> use prueba;
 * mysql> create table persona (id smallint auto_increment, nombre varchar(60), 
 *      nacimiento date, primary key(id)); 
 */
package org.turistmontoro;

import com.google.gson.Gson;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Date;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Clase de prueba de conexión con una base de datos MySQL
 */
//public class Consultas implements Job {
public class Consultas {

    private Connection conexion;
    private Statement s;
    private ArrayList<Oferta> datos;
    private String DELETE_OFFER = "DELETE FROM ofertas WHERE fechaFin<?";
    private String GET_OFFER_LOCAL = "SELECT * FROM ofertas WHERE usuario=? AND fechaFin>=?";
    private String GET_OFFER_DAILY = "SELECT * FROM ofertas WHERE fechaFin>=?";
    private String GET_OFFER_FILE_PASSED = "SELECT pathimagen FROM ofertas WHERE fechaFin<?";
    private PreparedStatement preparedStatement = null;
//    private ArrayList<ListaEntrada> allDatos;

    /**
     * Crea una instancia de la clase MySQL y realiza todo el código de
     * conexión, consulta y muestra de resultados.
     */
    public Consultas() {
//        allDatos = new ArrayList<ListaEntrada>();
        // Se mete todo en un try por los posibles errores de MySQL
    }

    public void crearConexion() {

        try {
            // Se registra el Driver de MySQL
            DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

            // Se obtiene una conexión con la base de datos. Hay que
            // cambiar el usuario "root" y la clave "la_clave" por las
            // adecuadas a la base de datos que estemos usando.
            Properties props = new Properties();
            props.put("user", "root");
            props.put("password", "root");

            props.put("autoReconnect", "true");
            conexion = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/webappmontturismo", props);

            datos = new ArrayList<Oferta>();
        } catch (Exception e) {

            System.err.println("Cannot connect to database server");
            System.err.println(e.getMessage());
            e.printStackTrace();
        }
    }

    public void deleteOfferPassed() {

        crearConexion();
        deleteFileOfertasPasadas();
        Date date = new Date();

        try {
            // Se crea un Statement, para realizar la consulta
            s = conexion.createStatement();
            preparedStatement = conexion.prepareStatement(DELETE_OFFER);
            preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
            preparedStatement.execute();
        } catch (SQLException ex) {
            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Se cierra la conexión con la base de datos.
//            conexion.close();
//    @Override
//    public void execute(JobExecutionContext jec) throws JobExecutionException {
//        doConsulta();
//    }
    public void getOfertaElGordo() {


        Gson gson = new Gson();
        ResultSet rs;


        Date date = new Date();
        try {
            // Se crea un Statement, para realizar la consulta
            s = conexion.createStatement();
            preparedStatement = conexion.prepareStatement(GET_OFFER_LOCAL);
            preparedStatement.setString(1, "elgordo");
            preparedStatement.setDate(2, new java.sql.Date(date.getTime()));
            rs = preparedStatement.executeQuery();
            datos.clear();
            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");

            while (rs.next()) {
                String fechaFin = sdf.format(rs.getDate("fechaFin"));
                datos.add(new Oferta(rs.getInt("id"), rs.getString("usuario"), rs.getString("descripcion"), rs.getString("titulo"), fechaFin, rs.getString("pathimagen")));
            }
            MontoroTWebService.ofertasElGordo = gson.toJson(datos);
        } catch (SQLException ex) {
            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    void getOfertaDiaria() {
        Gson gson = new Gson();
        ResultSet rs;
        Date date = new Date();
        try {
            // Se crea un Statement, para realizar la consulta
            s = conexion.createStatement();
            preparedStatement = conexion.prepareStatement(GET_OFFER_DAILY);
            preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
            rs = preparedStatement.executeQuery();
            datos.clear();
            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");

            while (rs.next()) {
                String fechaFin = sdf.format(rs.getDate("fechaFin"));
                datos.add(new Oferta(rs.getInt("id"), rs.getString("usuario"), rs.getString("descripcion"), rs.getString("titulo"), fechaFin, rs.getString("pathimagen")));
            }
            MontoroTWebService.ofertasDiarias = gson.toJson(datos);
        } catch (SQLException ex) {
            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    void deleteFileOfertasPasadas() {
        ResultSet rs;
        // Se realiza la consulta para obtener los bares. 
        datos.clear();
        Date date = new Date();
        try {
            // Se crea un Statement, para realizar la consulta
            s = conexion.createStatement();
            preparedStatement = conexion.prepareStatement(GET_OFFER_FILE_PASSED);
            preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
            rs = preparedStatement.executeQuery();

            while (rs.next()) {
                String url = rs.getString("pathimagen");
                int index = url.indexOf("/", 10);
                String nombreFichero = url.substring(index + 1);
                File finalFile = new File("/var/www/" + nombreFichero);
                finalFile.delete();
            }
        } catch (SQLException ex) {
            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    void getOfertaLocal(String local) {
        // Se realiza la consulta para obtener los bares. 
        datos.clear();

        Gson gson = new Gson();
        ResultSet rs;
        Date date = new Date();
        try {
            // Se crea un Statement, para realizar la consulta
            s = conexion.createStatement();
            preparedStatement = conexion.prepareStatement(GET_OFFER_LOCAL);
            preparedStatement.setString(1, local);
            preparedStatement.setDate(2, new java.sql.Date(date.getTime()));
            rs = preparedStatement.executeQuery();
            datos.clear();
            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");

            while (rs.next()) {
                String fechaFin = sdf.format(rs.getDate("fechaFin"));
                datos.add(new Oferta(rs.getInt("id"), rs.getString("usuario"), rs.getString("descripcion"), rs.getString("titulo"), fechaFin, rs.getString("pathimagen")));
            }
            MontoroTWebService.ofertasLocal= gson.toJson(datos);
        } catch (SQLException ex) {
            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}